import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 以灰度图的方式读取图片，显示灰度图
img = cv.imread("image/cat.jpeg", 0)
plt.imshow(img, cmap=plt.cm.gray)
plt.show()

"""
API：
    cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])
参数：
    images: 原图像。当传入函数时应该用中括号 [] 括起来，例如：[img]。
    channels: 如果输入图像是灰度图，它的值就是 [0]；如果是彩色图像的话，
              传入的参数可以是 [0]，[1]，[2] 它们分别对应着通道 B，G，R。 　　
    mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话，
          你就需要制作一个掩模图像，并使用它。（后边有例子） 　　
    histSize:BIN 的数目。也应该用中括号括起来，例如：[256]。 　　
    ranges: 像素值范围，通常为 [0，256]
"""

# 直方图
hist = cv.calcHist([img], [0], None, [256], [0, 256])
plt.figure(figsize=(10, 8))
plt.plot(hist)
plt.show()


# 掩膜的应用
# 创建蒙版(掩膜)
mask = np.zeros(img.shape[:2], np.uint8)
mask[400:650, 200:500] = 1
plt.imshow(mask, cmap=plt.cm.gray)
plt.show()
# 掩膜后的图像
mask_img = cv.bitwise_and(img, img, mask=mask)
plt.imshow(mask_img, cmap=plt.cm.gray)
plt.show()
# 传入掩膜,求出直方图
mask_hist = cv.calcHist([img], [0], mask, [256], [0, 256])
plt.figure(figsize=(10, 8))
plt.plot(mask_hist)
plt.show()


# 直方图均衡化(有些图像细节消失)
dst = cv.equalizeHist(img)
plt.imshow(dst, cmap=plt.cm.gray)
plt.show()

"""
API：
    cv.createCLAHE(clipLimit, tileGridSize)
参数：
    clipLimit: 对比度限制，默认是40
    tileGridSize: 分块的大小，默认为8*88∗8
"""
# 自适应的直方图均衡化(很好的保留了图像细节的同时提高了对比度)
cl = cv.createCLAHE(2.0, (8, 8))
clahe = cl.apply(img)
plt.imshow(clahe, cmap=plt.cm.gray)
plt.show()